// 该文件定义了一个日志宏，为了方便调试和查询运行情况
#pragma once
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <functional>
#include <unordered_map>
#include <thread>
#include <mutex>
#include <memory>
#include <typeinfo>
#include <condition_variable>

#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/epoll.h>
#include <sys/eventfd.h>
#include <sys/timerfd.h>
#include <signal.h>

#include <cassert>
#include <cstring>
#include <stdint.h>

// 日志打印
#define NORMAL 0
#define DEBUG 1
#define ERROR 2
#define FATAL 3
#define LOG_LEVEL DEBUG

// 根据等级打印日志 利用宏实现
#define LOG(level, format, ...)                                                                \
    do                                                                                         \
    {                                                                                          \
        if (level >= LOG_LEVEL)                                                                \
        {                                                                                      \
            time_t t = time(NULL);                                                             \
            struct tm *m = localtime(&t);                                                      \
            char tmp[32] = {0};                                                                \
            strftime(tmp, 31, "%H:%M:%S", m);                                                  \
            fprintf(stdout, "[%s %s:%d]" format "\n", tmp, __FILE__, __LINE__, ##__VA_ARGS__); \
        }                                                                                      \
    } while (0)

// ... 表示可变参数，可以传0个、1个、多个
// _VA_ARGS__ 将...的内容原封不动抄到__VA_ARGS__位置
// ##__VA_ARGS__ ...没有参数，就移除这个_VA_ARGS_，相对于没有这个东西

#define LOG_NORMAL(format, ...) LOG(NORMAL, format, ##__VA_ARGS__)
#define LOG_DEBUG(format, ...) LOG(DEBUG, format, ##__VA_ARGS__)
#define LOG_ERROR(format, ...) LOG(ERROR, format, ##__VA_ARGS__)
#define LOG_FATAL(format, ...) LOG(FATAL, format, ##__VA_ARGS__)